1 package edu.jiangxin.apktoolbox.file.checksum.panel;
2
3 import edu.jiangxin.apktoolbox.swing.extend.EasyChildTabbedPanel;
4 import edu.jiangxin.apktoolbox.utils.Constants;
5 import org.apache.commons.lang3.StringUtils;
6 import org.apache.commons.lang3.Strings;
7
8 import javax.swing.*;
9 import java.awt.*;
10 import java.io.Serial;
11
12 public class VerifyChecksumPanel extends EasyChildTabbedPanel {
13 @Serial
14 private static final long serialVersionUID = 1L;
15
16 private JPanel fileSumPanel;
17 private JTextArea fileSumTextArea;
18
19 private JPanel compareSumPanel;
20 private JTextArea compareSumTextArea;
21
22 private JPanel operationPanel;
23
24 private JTextField resultTextField;
25
26
27 @Override
28 public void createUI() {
29 BoxLayout boxLayout = new BoxLayout(this, BoxLayout.Y_AXIS);
30 setLayout(boxLayout);
31
32 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
33
34 createFileSumPanel();
35 add(fileSumPanel);
36
37 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
38
39 createCompareSumPanel();
40 add(compareSumPanel);
41
42 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
43
44 createOperationPanel();
45 add(operationPanel);
46 }
47
48 private void createFileSumPanel() {
49 fileSumPanel = new JPanel();
50 BoxLayout boxLayout = new BoxLayout(fileSumPanel, BoxLayout.Y_AXIS);
51 fileSumPanel.setLayout(boxLayout);
52
53 JLabel fileSumLabel = new JLabel("Paste calculated file summary from \"File Checksum\" tabbed panel here:");
54 fileSumTextArea = new JTextArea(5, 4);
55 fileSumTextArea.setLineWrap(true);
56 JScrollPane fileSumScrollPanel = new JScrollPane(fileSumTextArea);
57
58 fileSumPanel.add(fileSumLabel);
59 fileSumPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
60 fileSumPanel.add(fileSumScrollPanel);
61 }
62
63 private void createCompareSumPanel() {
64 compareSumPanel = new JPanel();
65 BoxLayout boxLayout = new BoxLayout(compareSumPanel, BoxLayout.Y_AXIS);
66 compareSumPanel.setLayout(boxLayout);
67
68 JLabel compareSumLabel = new JLabel("Paste your compared file summary here:");
69 compareSumTextArea = new JTextArea(5, 4);
70 compareSumTextArea.setLineWrap(true);
71 JScrollPane compareSumScrollPanel = new JScrollPane(compareSumTextArea);
72
73 compareSumPanel.add(compareSumLabel);
74 compareSumPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
75 compareSumPanel.add(compareSumScrollPanel);
76 }
77
78 private void createOperationPanel() {
79 operationPanel = new JPanel();
80
81 JButton compareButton = new JButton("Compare");
82 compareButton.setFocusPainted(false);
83 compareButton.addActionListener(event -> {
84 String fileSum = fileSumTextArea.getText();
85 if (!isValidSummary(fileSum)) {
86 resultTextField.setText("File summary is not valid");
87 resultTextField.setForeground(Color.YELLOW);
88 return;
89 }
90
91 String compareSum = compareSumTextArea.getText();
92 if (!isValidSummary(compareSum)) {
93 resultTextField.setText("Compared summary is not valid");
94 resultTextField.setForeground(Color.YELLOW);
95 return;
96 }
97
98 if (Strings.CI.equals(fileSum, compareSum)) {
99 resultTextField.setText("File summary is same with compared summary");
100 resultTextField.setForeground(Color.GREEN);
101 return;
102 }
103
104 resultTextField.setText("File summary is different from compared summary");
105 resultTextField.setForeground(Color.RED);
106 });
107
108 resultTextField = new JTextField("To be comparing");
109 resultTextField.setPreferredSize(new Dimension(100, 25));
110 resultTextField.setEditable(false);
111 resultTextField.setBorder(null);
112 Font font = new Font(null, Font.BOLD, 16);
113 resultTextField.setFont(font);
114 resultTextField.setForeground(Color.YELLOW);
115
116 operationPanel.setLayout(new BoxLayout(operationPanel, BoxLayout.X_AXIS));
117 operationPanel.add(compareButton);
118 operationPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
119 operationPanel.add(resultTextField);
120 operationPanel.add(Box.createHorizontalGlue());
121 }
122
123 private boolean isValidSummary(String summary) {
124 if (StringUtils.isEmpty(summary)) {
125 return false;
126 }
127 return StringUtils.containsOnly(summary, "0123456789ABCDEFabcdef");
128 }
129 }
130
131